<?php

if (!defined('ROOT'))
die();

/**
 * Інколи незручно або не потрібно зберігати інформацію в БД, можна зберегти в файл.
 * Для цього створений даний клас.
 * 
 * @package Aurus
 * @author Kvis
 * @copyright 2010
 * @version 1.0
 * @access public
 */
class FileDB {

	private static $needUpdateFlist = false;
	private static $fileListByIndex = array();
	private static $fileListByDb = array();
	private static $fileListGot = false;

	/**
     * Вставити дані в фйлову БД
     *
     * @param string $db - назва "бази"
     * @param string $index - індекс в "базі"
     * @param string $data - дані, які потрібно зберегти
     */
	public static function insert($db, $index, $data) {
		self::_put($db . '__' . $index, serialize($data));
	}

	/**
     * Повертає дані з бази.
     *
     * @param string $db - назва "бази"
     * @param string $index - індекс в "базі"
     * @return mixed
     */
	public static function select($db, $index) {
		return self::_get($db . '__' . $index);
	}

	/**
     * @ignore 
     */
	private static function _put($fname, $cont) {
		$path = MAINDIR . '/filedb/';
		$cont = '<?php die(); ?>' . $cont;
		$fp = fopen($path . $fname . '.php', 'wb') or die('Cant open file for writing.');
		flock($fp, LOCK_EX);
		fwrite($fp, $cont);
		flock($fp, LOCK_UN);
		fclose($fp);
	}

	/**
     * @ignore
     */
	private static function _get($fname) {
		$path = MAINDIR . '/filedb/';
		if (!file_exists($path . $fname . '.php')) {
			return false;
		}
		$fp = fopen($path . $fname . '.php', 'rb') or die('Cant open file for reading.');
		flock($fp, LOCK_EX);
		$ret = fread($fp, filesize($path . $fname . '.php'));
		flock($fp, LOCK_UN);
		fclose($fp);
		return unserialize(substr($ret, 15));
	}

	/**
     * Повертає всі дані з вказаним індексом, або вказаною БД
     *
     * @param string $byIndex - назва індексу
     * @param string $byDb - назва БД
     * @return array - масив результатів
     */
	public static function select_where($byIndex = '', $byDb = '') {
		self::getFileList();
		if ($byDb) {
			if (!isset(self::$fileListByDb[$byDb]) or !self::$fileListByDb[$byDb] or !is_array(self::$fileListByDb[$byDb]))
			return;
			foreach (self::$fileListByDb[$byDb] as $index) {
				$ret[$index] = self::_get($byDb . '__' . $index);
			}
		} elseif ($byIndex) {
			if (!isset(self::$fileListByIndex[$byIndex]) or !self::$fileListByIndex[$byIndex] or !is_array(self::$fileListByIndex[$byIndex]))
			return;
			foreach (self::$fileListByIndex[$byIndex] as $db) {
				$ret[$byIndex] = self::_get($db . '__' . $byIndex);
			}
		} else
		return false;

		return $ret;
	}

	/**
     * @ignore
     */
	private static function getFileList() {
		if (self::$fileListGot)
		return;
		$dh = opendir(MAINDIR . '/filedb/');

		while (!is_bool($file = readdir($dh))) {
			if (!$file or $file == '.' or $file == '..' or is_dir(MAINDIR . '/filedb/' . $file)) {
				continue;
			}
			

			list($db, $index) = explode('__', substr($file, 0, -4));

			self::$fileListByDb[$db][] = $index;
			self::$fileListByIndex[$index][] = $db;
		}
		closedir($dh);
	}

	/**
     * Видаляє дані з бази.
     *
     * @param string $db - назва "бази"
     * @param string $index - індекс в "базі"
     * @return boolean
     */
	public static function delete($db, $index) {
		return unlink(MAINDIR . '/filedb/' . $db . '__' . $index . '.php');
	}

}
